/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package org.sapra.dep.echo.CambioFecha;

import org.sapra.dep.CalendarioFacturacion;
import org.sapra.dep.EmpresaMO;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import nextapp.echo2.app.Alignment;
import nextapp.echo2.app.Border;
import nextapp.echo2.app.Button;
import nextapp.echo2.app.CheckBox;
import nextapp.echo2.app.Color;
import nextapp.echo2.app.Column;
import nextapp.echo2.app.Component;
import nextapp.echo2.app.ContentPane;
import nextapp.echo2.app.Extent;
import nextapp.echo2.app.Font;
import nextapp.echo2.app.Insets;
import nextapp.echo2.app.Label;
import nextapp.echo2.app.Row;
import nextapp.echo2.app.SelectField;
import nextapp.echo2.app.SplitPane;
import nextapp.echo2.app.Table;
import nextapp.echo2.app.TextField;
import nextapp.echo2.app.WindowPane;
import nextapp.echo2.app.event.ActionEvent;
import nextapp.echo2.app.event.ActionListener;
import nextapp.echo2.app.filetransfer.UploadEvent;
import nextapp.echo2.app.filetransfer.UploadListener;
import nextapp.echo2.app.filetransfer.UploadSelect;
import nextapp.echo2.app.layout.TableLayoutData;
import nextapp.echo2.app.list.DefaultListModel;
import nextapp.echo2.app.table.DefaultTableCellRenderer;
import nextapp.echo2.app.table.DefaultTableModel;
import nextapp.echo2.app.table.TableCellRenderer;
import nextapp.echo2.webrender.WebRenderServlet;
import org.sapra.dep.conexion.DAC_Ext;
import org.sapra.dep.conexion.DAC_Insert;
import org.sapra.echo.wAviso;



/**
 *
 * @author  Luis Guerrero
 */
public class CambioFecha extends ContentPane {

    public CambioFecha() {
        Contenedor();
        this.bandera=0;
        this.id_Empresa=0;
    }

    public CambioFecha(int bandera,int fk_empresaId){

        this.bandera=bandera;
        this.id_Empresa=fk_empresaId;
        Contenedor();
    }
    private int bandera=0;
    private int id_Empresa=0;
    private WindowPane HeaderW,Body,FechaFactW;
    private UploadSelect carga;
    private SelectField seleccion=new SelectField();
    private ArrayList<EmpresaMO> listaEmpresa=new ArrayList<EmpresaMO>();
    private Table fechas=new Table();
    private ArrayList<CalendarioFacturacion> listaFecha =new ArrayList<CalendarioFacturacion>();
    private Button Limpiar,Guardar,fechaFact;
    public void Contenedor(){

             String idUser = (String)WebRenderServlet.getActiveConnection().getRequest().getSession().getAttribute("_user2");
             String empresa = (String)WebRenderServlet.getActiveConnection().getRequest().getSession().getAttribute("fk_empresaId");


            HeaderW=Ventana(Color.WHITE,new Extent(40),new Extent(0),new Extent(1190),new Extent(100),false,false,new Extent(0));
            Body=Ventana(Color.WHITE,new Extent(40),new Extent(110),new Extent(1190),new Extent(500),false,false,new Extent(0));


            //HeaderW.add(new Header(Integer.parseInt(idUser),Integer.parseInt(empresa)));
            //Body.add();
            //add(HeaderW);
            add(body());



            setBackground(Color.WHITE);

    }

    public ContentPane body(){
        Column col=new Column();
        carga=new UploadSelect();
        ContentPane cp=new ContentPane();
        Row botones=new Row();
        Row fechaButon=new Row();
        Row load=new Row();
        Row rTabla=new Row();
        try {


        Guardar=botonesMenu("Guardar", 20, 160, new Color(176,196,222), Color.WHITE);
        Limpiar=botonesMenu("Limpiar", 20, 160, new Color(176,196,222), Color.WHITE);
        fechaFact=botonesMenu("Fechas de Facturacion", 20, 160, new Color(176,196,222), Color.WHITE);
        botones.add(Guardar);
        botones.add(Limpiar);
        fechaButon.add(fechaFact);
        Row empresa=rowCombos("Empresa:",seleccion);

        Label lb=new Label("Carga de Archivo: ");

        seleccion.setModel(modeloEmpresa());

        load.add(lb);
        load.add(carga);

        rTabla.add(fechas);
        listaFecha=arreglo(listaFecha);
        fechas.setModel(modeloTabla(listaFecha));
        fechas.setDefaultRenderer(Object.class, new cellTable());
        fechas.setDefaultHeaderRenderer(new Header2());
        fechas.setBorder(new Border(1, Color.BLACK, 1));
        fechas.setWidth(new Extent(900,Extent.PX));
        fechas.setInsets(new nextapp.echo2.app.Insets(5));
        botones.setAlignment(Alignment.ALIGN_CENTER);
        empresa.setAlignment(Alignment.ALIGN_CENTER);
        load.setAlignment(Alignment.ALIGN_CENTER);
        rTabla.setAlignment(Alignment.ALIGN_CENTER);
        fechaButon.setAlignment(Alignment.ALIGN_CENTER);

        botones.add(Guardar);
        botones.add(Limpiar);



        col.add(empresa);
        col.add(fechaButon);
        col.add(load);
        col.add(botones);
        col.add(rTabla);

        col.setInsets(new Insets(25,Extent.PX));
        col.setCellSpacing(new Extent(10));
        cp.add(col);
        acciones();
         } catch (Exception e) {
             e.printStackTrace();
        }
        return cp;
    }
    public DefaultListModel modeloEmpresa(){
        DAC_Ext ne=new DAC_Ext();
        DefaultListModel dtm=new DefaultListModel();
        if(bandera==0){
                listaEmpresa=ne.empresaCorp(0,1);
                try {
                        if(listaEmpresa.size()>0){
                            System.out.println(listaEmpresa.size());
                                 EmpresaMO emp=new EmpresaMO();
                                 for(int i=0;i<listaEmpresa.size();i++){
                                         emp=new EmpresaMO();
                                         emp=(EmpresaMO)listaEmpresa.get(i);
                                         seleccion.setSelectedItem(emp);
                                         dtm.add(""+emp.getRazonEmpresa());
                                         //seleccion.setSelectedItem(emp);
                                 }
                        }

                }
                catch (Exception e) {
                }
        }
        else{
            EmpresaMO emp=new EmpresaMO(id_Empresa);
            listaEmpresa.add(emp);
            dtm.add(""+emp.getRazonEmpresa());
        }
        return dtm;
    }
    public  ArrayList<CalendarioFacturacion> arreglo(ArrayList<CalendarioFacturacion> listaTotal){
         if(listaTotal.size()>0){
                        ArrayList<CalendarioFacturacion> temp =new ArrayList<CalendarioFacturacion>();
                        SimpleDateFormat formatoDelTexto = new SimpleDateFormat("yyyy-MM-dd");
                        for(int i=0;i<listaTotal.size();i++){
                                Date fechaFin=null;
                                CalendarioFacturacion cf=new CalendarioFacturacion();
                                cf=(CalendarioFacturacion)listaTotal.get(i);
                                Date fechaActual = new Date();
                                if(!cf.getDia_fin().trim().equals("")){
                                        try {
                                        fechaFin=formatoDelTexto.parse(cf.getDia_fin());
                                        long fact=fechaActual.getTime();
                                        long ffin=fechaFin.getTime();
                                        if(ffin>=fact){
                                                temp.add(cf);
                                        }
                                        } catch (Exception e) {
                                            //WindowPane exc=Ventana(Color.WHITE,new Extent(50),new Extent(50),new Extent(300),new Extent(400),true,true,new Extent(20));
                                            //exc.add(new Label("Error en el archivo Cargado"));
                                            listaTotal.clear();
                                            add(new Aviso("Advertencia", "Error en el archivo de Carga"));
                                            return listaTotal;
                                        }
                                }

                        }
                        listaTotal=temp;
        }

         return listaTotal;
    }
    public DefaultTableModel modeloTabla(ArrayList<CalendarioFacturacion> listaTotal){
        DefaultTableModel dtm=new DefaultTableModel(7,0);
        String title[]={"Dia Limite para Autorizar","Dia GAP","Dia de Dispersion","Dia de Pago","Dia de Inicio","Dia de Fin","Dias A Pagar"};
            for(int i=0;i<title.length;i++){
                     dtm.setColumnName(i,title[i]);
            }
        if(listaTotal.size()>=0){
                        ArrayList<CalendarioFacturacion> temp =new ArrayList<CalendarioFacturacion>();
                        SimpleDateFormat formatoDelTexto = new SimpleDateFormat("yyyy-MM-dd");
                        for(int i=0;i<listaTotal.size();i++){
                                Date fechaFin=null;
                                CalendarioFacturacion cf=new CalendarioFacturacion();
                                cf=(CalendarioFacturacion)listaTotal.get(i);
                                        Object[] o=new Object[7];
                                        o[0]=cf.getDia_limite_aut_fac();
                                        o[1]=cf.getDia_gap();
                                        o[2]=cf.getDia_dispersion();
                                        o[3]=cf.getDia_pago();
                                        o[4]=cf.getDia_inicio();
                                        o[5]=cf.getDia_fin();
                                        o[6]=cf.getDias_a_pagar_periodo();
                                        dtm.addRow(o);
                                        temp.add(cf);

                        }
        }
 else{
            add(new wAviso("error","la lista llega en 0"));
 }
        return dtm;
    }

    public void acciones(){
        try {
            carga.addUploadListener(new UploadListener() {

                public void fileUpload(UploadEvent uploadEvent) {
                    try {
                            String fechaStr;
                            listaFecha =new ArrayList<CalendarioFacturacion>();
                             String nameFile=uploadEvent.getFileName();
                             byte[] b = new byte[uploadEvent.getSize()];
                             uploadEvent.getInputStream().read(b, 0, uploadEvent.getSize());
                             File f=new File(nameFile);
                             f.createNewFile();
                             FileOutputStream outputStream = new FileOutputStream(f);
                             outputStream.write(b);
                             outputStream.close();
                             BufferedReader r=new BufferedReader(new FileReader(f));
                             r.readLine();
                             while(true){
                                 fechaStr=r.readLine();
                                 if (fechaStr == null)
                                        break;
                                  listado(fechaStr);
                             }
                             //listaFecha=arreglo(listado(fechaStr));
                             //listaFecha=listado(fechaStr);
                             fechas.setModel(modeloTabla(listaFecha));
                             r.close();
                             f.delete();
                             f.deleteOnExit();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }

                public void invalidFileUpload(UploadEvent uploadEvent) {
                    try {
                        listaFecha =new ArrayList<CalendarioFacturacion>();
                        fechas.setModel(modeloTabla(listaFecha));
                    } catch (Exception e) {
                    }

                }
            });

            Limpiar.addActionListener(new ActionListener() {

                public void actionPerformed(ActionEvent e) {
                    listaFecha =new ArrayList<CalendarioFacturacion>();
                    fechas.setModel(modeloTabla(listaFecha));
                }
            });

            Guardar.addActionListener(new ActionListener() {

                public void actionPerformed(ActionEvent e) {
                    DAC_Ext ext=new DAC_Ext();
                    DAC_Insert di=new DAC_Insert();
                    if(seleccion.getSelectedIndex()!=-1){
                        if(listaFecha != null || listaFecha.size()>0){
                                EmpresaMO emp=new EmpresaMO();
                                emp=(EmpresaMO)listaEmpresa.get(seleccion.getSelectedIndex());
                                ArrayList<CalendarioFacturacion> listaDelete =new ArrayList<CalendarioFacturacion>();
                                //listaDelete=ext.fechaFacturacion(52, listaFecha);
                                //di.deleteCalFacturacion(listaDelete);
                                boolean res=di.insertarFecha(listaFecha, emp.getEmpresaId());
                                if(res==true){
                                    listaFecha =new ArrayList<CalendarioFacturacion>();
                                    fechas.setModel(modeloTabla(listaFecha));
                                    add(new Aviso("Proceso Correcto", "El Proceso ha sido un exito"));
                                }else{
                                    add(new Aviso("Error","Favor de Corregir Las Fechas"+listaFecha.toString()));
                                }
                        }else{
                                add(new Aviso("Error","No Existen Fechas para Cargar"));
                                return;
                         }
                    }
                    else{
                        add(new Aviso("Error","Favor de Seleccionar una Empresa"));
                        return;
                    }

                }
            });

            fechaFact.addActionListener(new ActionListener() {

                public void actionPerformed(ActionEvent e) {
                    if(seleccion.getSelectedIndex()!=-1){
                               FechaFactW=Ventana(Color.WHITE,new Extent(1),new Extent(1),new Extent(1000),new Extent(500),false,false,new Extent(0));
                               //FechaFactW=new WindowPane();
                               FechaFactW.setClosable(true);
                               FechaFactW.setTitleHeight(new Extent(25));
                               FechaFactW.setTitle("Fechas de Facturacion Existentes");
                               FechaFactW.setMovable(true);
                               FechaFactW.add(contenedor2());
                               add(FechaFactW);
                    }else{
                        add(new Aviso("Error","Favor de Seleccionar una Empresa"));
                        return;
                    }


                }
            });
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
    private Button Eliminar;
    private Table tablaFecha2=new Table();
    private ArrayList<CalendarioFacturacion> listaSinFactura =new ArrayList<CalendarioFacturacion>();
    public ContentPane contenedor2(){
        DAC_Ext ext=new DAC_Ext();
        EmpresaMO emp=new EmpresaMO();

        emp=(EmpresaMO)listaEmpresa.get(seleccion.getSelectedIndex());
        listaSinFactura=ext.fechaFacturacion(emp.getEmpresaId());


        ContentPane cp=new ContentPane();
        Row linea1=new Row();
        Row linea2=new Row();

        SplitPane sp=SplitPaneHelper(SplitPane.ORIENTATION_VERTICAL, new Extent(140,Extent.PX), false);
        SplitPane sp2=SplitPaneHelper(SplitPane.ORIENTATION_VERTICAL, new Extent(500,Extent.PX), false);
        sp.add(sp);
        sp.add(sp2);
        sp.setBackground(Color.BLUE);
        sp2.setBackground(Color.YELLOW);

        Eliminar=botonesMenu("Eliminar", 20, 160, new Color(176,196,222), Color.WHITE);
        listaSinFactura=arreglo(listaSinFactura);
        tablaFecha2.setModel(modeloTabla(listaSinFactura));
        tablaFecha2.setDefaultRenderer(Object.class, new cellTable());
        tablaFecha2.setDefaultHeaderRenderer(new Header2());
        tablaFecha2.setBorder(new Border(1, Color.BLACK, 1));
        tablaFecha2.setWidth(new Extent(950,Extent.PX));
        tablaFecha2.setInsets(new nextapp.echo2.app.Insets(5));
        tablaFecha2.setSelectionEnabled(true);
        tablaFecha2.setSelectionFont(new Font(Font.ARIAL,1, new Extent(8)));
        tablaFecha2.setSelectionBackground(new Color(220,20,60));
        tablaFecha2.setSelectionForeground(Color.WHITE);
        tablaFecha2.setRolloverEnabled(true);
        tablaFecha2.setRolloverBackground(new Color(240,128,128));
        tablaFecha2.setRolloverForeground(Color.WHITE);

        linea1.add(Eliminar);
        linea2.add(tablaFecha2);
        linea1.setAlignment(Alignment.ALIGN_CENTER);
        linea2.setAlignment(Alignment.ALIGN_CENTER);

        Column col=new Column();
        col.add(linea1);
        col.add(linea2);
        cp.add(col);
        AccionesFechaSinFact();
        return cp;
    }

    public void AccionesFechaSinFact(){
        Eliminar.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                CalendarioFacturacion cf=null;
                if(tablaFecha2.getSelectionModel().getMinSelectedIndex()!=-1){
                    cf=new CalendarioFacturacion();
                    try{
                    cf=(CalendarioFacturacion)listaSinFactura.get(tablaFecha2.getSelectionModel().getMinSelectedIndex());
                    }catch(Exception ex){
                        add(new wAviso("ERROR","YA NO EXISTEN MAS REGISTROS"));
                    }

                    DAC_Insert di=new DAC_Insert();cf.getDia_inicio();
                    di.deleteCalFacturacion(cf);
                    DAC_Ext ext=new DAC_Ext();
                    EmpresaMO emp=new EmpresaMO();

                    emp=(EmpresaMO)listaEmpresa.get(seleccion.getSelectedIndex());
                    System.out.println(emp.getEmpresaId());
                    listaSinFactura=ext.fechaFacturacion(emp.getEmpresaId());
                    listaSinFactura=arreglo(listaSinFactura);
                    tablaFecha2.setModel(modeloTabla(listaSinFactura));
                }
                else{
                     add(new Aviso("Error","Favor de Seleccionar una Fecha de Facturacion"));
                     return;
                }

            }
        });
    }
    public ArrayList<CalendarioFacturacion> listado(String fechaStr){
            CalendarioFacturacion cf=new CalendarioFacturacion();
            String fecha[]=fechaStr.split(",");
            for(int i=0;i<fecha.length;i++){
                if(fecha[i]!=null){
                String x=fecha[i];
                x=x.replace("'","").trim();
                if(i!=6){
                    String a[]=x.split("/");
                    x=a[2]+"-"+a[1]+"-"+a[0];
                }
                switch(i){
                    case 0:cf.setDia_limite_aut_fac(x);break;
                    case 1:cf.setDia_gap(x);break;
                    case 2:cf.setDia_dispersion(x);break;
                    case 3:cf.setDia_pago(x);break;
                    case 4:cf.setDia_inicio(x);break;
                    case 5:cf.setDia_fin(x);break;
                    case 6:cf.setDias_a_pagar_periodo(x);break;
                }
                }
            }
            listaFecha.add(cf);
            return listaFecha;
        }
    public Row rowCombos(String label,SelectField select){
        Row r=new Row();
        r.setCellSpacing(new Extent(10));
        r.setInsets(new Insets(2));
        Label lab=new Label(label);
        lab.setFont(new nextapp.echo2.app.Font(Font.ARIAL, 1, new Extent(12)));
        select.setWidth(new Extent(300,Extent.PX));
        select.setFont(new nextapp.echo2.app.Font(Font.ARIAL, 1, new Extent(12)));

        r.add(lab);
        r.add(select);
        return r;

    }
    public WindowPane Ventana(Color color,Extent PosX,Extent PosY,Extent Width,Extent Height,Boolean cierre,Boolean resize,Extent medidaTitle){
            WindowPane wp=new WindowPane();
            wp.setBackground(color);
            wp.setPositionX(PosX);
            wp.setPositionY(PosY);
            wp.setWidth(Width);
            wp.setHeight(Height);
            wp.setClosable(cierre);
            wp.setResizable(resize);
            wp.setTitleHeight(medidaTitle);
            return wp;
    }


    public Button botonesMenu(String title,int height,int width,Color color,Color colorFont){
        Button but=new Button();
        but.setText(title);
        but.setHeight(new Extent(height));
        but.setWidth(new Extent(width));
        but.setBackground(color);
        but.setForeground(colorFont);
        but.setBorder(new nextapp.echo2.app.Border(new Extent(1,Extent.PX), Color.BLACK, 1));
        but.setAlignment(Alignment.ALIGN_CENTER);
        but.setTextAlignment(Alignment.ALIGN_CENTER);
        return but;
    }

    public SplitPane SplitPaneHelper(int orient,Extent ext,boolean resize){
        SplitPane resp = new nextapp.echo2.app.SplitPane();
        resp.setOrientation(orient);
        resp.setResizable(resize);
        resp.setSeparatorPosition(ext);
        resp.setSeparatorColor(Color.BLACK);

        return resp;
    }
    public Row rowTextField(String title,int espacio,TextField tFld,int Insts){
            Row r=new Row();
            Label l=new Label(title);
            l.setFont(new nextapp.echo2.app.Font(Font.ARIAL, 1, new Extent(12)));
            tFld.setFont(new nextapp.echo2.app.Font(Font.ARIAL, 1, new Extent(12)));

            r.setInsets(new Insets(Insts));
            r.setCellSpacing(new Extent(espacio));
            r.add(l);
            r.add(tFld);

            return r;
        }
        public Row rowLabel(String title,Color color){
            Row r=new Row();
            Label l=new Label(title);
            l.setFont(new nextapp.echo2.app.Font(Font.ARIAL, 1, new Extent(12)));
            l.setForeground(color);
            r.add(l);
            //r.setBorder(new Border(1, Color.BLACK, 1));r.setInsets(new Insets(10));
            return r;
    }
        public Row rowButton(String title,String titulo,Button but){
            Row r=new Row();
            Label l=new Label(title);
            l.setFont(new nextapp.echo2.app.Font(Font.ARIAL, 1, new Extent(12)));
            l.setForeground(Color.BLACK);
            but.setText(titulo);
            but.setWidth(new Extent(130));
            but.setBackground(Color.DARKGRAY);
            but.setForeground(Color.WHITE);
            but.setAlignment(Alignment.ALIGN_CENTER);
            r.add(l);
            r.add(but);
            //r.setBorder(new Border(1, Color.BLACK, 1));
            r.setInsets(new Insets(10));
            return r;
    }
    public Row rowCheckBox(String title,CheckBox chb,int espacio,int Insts){
            Row r=new Row();
            Label l=new Label(title);
            l.setFont(new nextapp.echo2.app.Font(Font.ARIAL, 1, new Extent(12)));
            l.setForeground(Color.BLACK);
            r.setInsets(new Insets(Insts));
            r.setCellSpacing(new Extent(espacio));
            r.add(l);
            r.add(chb);
            //r.setBorder(new Border(1, Color.BLACK, 1));r.setInsets(new Insets(10));
            return r;
    }
        public TextField textLabels(int largo,int longitud,boolean habilitado){
            TextField txt=new TextField();
            txt.setFont(new nextapp.echo2.app.Font(Font.ARIAL, 1, new Extent(12)));
            txt.setWidth(new Extent(largo,Extent.PX));
            txt.setMaximumLength(longitud);
            txt.setEnabled(habilitado);
            txt.setAlignment(Alignment.ALIGN_LEFT);
            //txt.setBorder(new nextapp.echo2.app.Border(2, Color.BLACK, 2));
            txt.setHeight(new Extent(15));
            return txt;
        }
}
class Header2 extends DefaultTableCellRenderer implements TableCellRenderer{

@Override
    public Component getTableCellRendererComponent(Table table,Object value,int column,int row){

        Label label=new Label(value.toString());
        TableLayoutData tld=new TableLayoutData();
        tld.setBackground(new Color(128,128,128));
        label.setForeground(Color.WHITE);
        label.setLayoutData(tld);
        label.setFont(new Font(Font.ARIAL, 1, new Extent(12)));
        tld.setAlignment(Alignment.ALIGN_CENTER);
        return label;
    }

}

class cellTable extends DefaultTableCellRenderer implements TableCellRenderer{

@Override
    public Component getTableCellRendererComponent(Table table,Object value,int column,int row){

        Label label=new Label(value.toString());
        TableLayoutData tld=new TableLayoutData();
        if(row%2==0)
            tld.setBackground(Color.WHITE);//175 238 238
        else
            tld.setBackground(new Color(175,238,238));//175 238 238
        label.setForeground(Color.BLACK);
        tld.setAlignment(Alignment.ALIGN_CENTER);
        label.setLayoutData(tld);
        label.setFont(new Font(Font.ARIAL, 1, new Extent(9)));

        return label;
    }

}